home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / include / asm-generic / siginfo.h < prev    next >
C/C++ Source or Header  |  2008-10-24  |  8KB  |  260 lines

  1. #ifndef _ASM_GENERIC_SIGINFO_H
  2. #define _ASM_GENERIC_SIGINFO_H
  3.  
  4.  
  5. #include <linux/types.h>
  6.  
  7. typedef union sigval {
  8.     int sival_int;
  9.     void *sival_ptr;
  10. } sigval_t;
  11.  
  12. /*
  13.  * This is the size (including padding) of the part of the
  14.  * struct siginfo that is before the union.
  15.  */
  16. #ifndef __ARCH_SI_PREAMBLE_SIZE
  17. #define __ARCH_SI_PREAMBLE_SIZE    (3 * sizeof(int))
  18. #endif
  19.  
  20. #define SI_MAX_SIZE    128
  21. #ifndef SI_PAD_SIZE
  22. #define SI_PAD_SIZE    ((SI_MAX_SIZE - __ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
  23. #endif
  24.  
  25. #ifndef __ARCH_SI_UID_T
  26. #define __ARCH_SI_UID_T    uid_t
  27. #endif
  28.  
  29. /*
  30.  * The default "si_band" type is "long", as specified by POSIX.
  31.  * However, some architectures want to override this to "int"
  32.  * for historical compatibility reasons, so we allow that.
  33.  */
  34. #ifndef __ARCH_SI_BAND_T
  35. #define __ARCH_SI_BAND_T long
  36. #endif
  37.  
  38. #ifndef HAVE_ARCH_SIGINFO_T
  39.  
  40. typedef struct siginfo {
  41.     int si_signo;
  42.     int si_errno;
  43.     int si_code;
  44.  
  45.     union {
  46.         int _pad[SI_PAD_SIZE];
  47.  
  48.         /* kill() */
  49.         struct {
  50.             pid_t _pid;        /* sender's pid */
  51.             __ARCH_SI_UID_T _uid;    /* sender's uid */
  52.         } _kill;
  53.  
  54.         /* POSIX.1b timers */
  55.         struct {
  56.             timer_t _tid;        /* timer id */
  57.             int _overrun;        /* overrun count */
  58.             char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
  59.             sigval_t _sigval;    /* same as below */
  60.             int _sys_private;       /* not to be passed to user */
  61.         } _timer;
  62.  
  63.         /* POSIX.1b signals */
  64.         struct {
  65.             pid_t _pid;        /* sender's pid */
  66.             __ARCH_SI_UID_T _uid;    /* sender's uid */
  67.             sigval_t _sigval;
  68.         } _rt;
  69.  
  70.         /* SIGCHLD */
  71.         struct {
  72.             pid_t _pid;        /* which child */
  73.             __ARCH_SI_UID_T _uid;    /* sender's uid */
  74.             int _status;        /* exit code */
  75.             clock_t _utime;
  76.             clock_t _stime;
  77.         } _sigchld;
  78.  
  79.         /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
  80.         struct {
  81.             void *_addr; /* faulting insn/memory ref. */
  82. #ifdef __ARCH_SI_TRAPNO
  83.             int _trapno;    /* TRAP # which caused the signal */
  84. #endif
  85.         } _sigfault;
  86.  
  87.         /* SIGPOLL */
  88.         struct {
  89.             __ARCH_SI_BAND_T _band;    /* POLL_IN, POLL_OUT, POLL_MSG */
  90.             int _fd;
  91.         } _sigpoll;
  92.     } _sifields;
  93. } siginfo_t;
  94.  
  95. #endif
  96.  
  97. /*
  98.  * How these fields are to be accessed.
  99.  */
  100. #define si_pid        _sifields._kill._pid
  101. #define si_uid        _sifields._kill._uid
  102. #define si_tid        _sifields._timer._tid
  103. #define si_overrun    _sifields._timer._overrun
  104. #define si_sys_private  _sifields._timer._sys_private
  105. #define si_status    _sifields._sigchld._status
  106. #define si_utime    _sifields._sigchld._utime
  107. #define si_stime    _sifields._sigchld._stime
  108. #define si_value    _sifields._rt._sigval
  109. #define si_int        _sifields._rt._sigval.sival_int
  110. #define si_ptr        _sifields._rt._sigval.sival_ptr
  111. #define si_addr        _sifields._sigfault._addr
  112. #ifdef __ARCH_SI_TRAPNO
  113. #define si_trapno    _sifields._sigfault._trapno
  114. #endif
  115. #define si_band        _sifields._sigpoll._band
  116. #define si_fd        _sifields._sigpoll._fd
  117.  
  118. #define __SI_KILL    0
  119. #define __SI_TIMER    0
  120. #define __SI_POLL    0
  121. #define __SI_FAULT    0
  122. #define __SI_CHLD    0
  123. #define __SI_RT        0
  124. #define __SI_MESGQ    0
  125. #define __SI_CODE(T,N)    (N)
  126.  
  127. /*
  128.  * si_code values
  129.  * Digital reserves positive values for kernel-generated signals.
  130.  */
  131. #define SI_USER        0        /* sent by kill, sigsend, raise */
  132. #define SI_KERNEL    0x80        /* sent by the kernel from somewhere */
  133. #define SI_QUEUE    -1        /* sent by sigqueue */
  134. #define SI_TIMER __SI_CODE(__SI_TIMER,-2) /* sent by timer expiration */
  135. #define SI_MESGQ __SI_CODE(__SI_MESGQ,-3) /* sent by real time mesq state change */
  136. #define SI_ASYNCIO    -4        /* sent by AIO completion */
  137. #define SI_SIGIO    -5        /* sent by queued SIGIO */
  138. #define SI_TKILL    -6        /* sent by tkill system call */
  139. #define SI_DETHREAD    -7        /* sent by execve() killing subsidiary threads */
  140.  
  141. #define SI_FROMUSER(siptr)    ((siptr)->si_code <= 0)
  142. #define SI_FROMKERNEL(siptr)    ((siptr)->si_code > 0)
  143.  
  144. /*
  145.  * SIGILL si_codes
  146.  */
  147. #define ILL_ILLOPC    (__SI_FAULT|1)    /* illegal opcode */
  148. #define ILL_ILLOPN    (__SI_FAULT|2)    /* illegal operand */
  149. #define ILL_ILLADR    (__SI_FAULT|3)    /* illegal addressing mode */
  150. #define ILL_ILLTRP    (__SI_FAULT|4)    /* illegal trap */
  151. #define ILL_PRVOPC    (__SI_FAULT|5)    /* privileged opcode */
  152. #define ILL_PRVREG    (__SI_FAULT|6)    /* privileged register */
  153. #define ILL_COPROC    (__SI_FAULT|7)    /* coprocessor error */
  154. #define ILL_BADSTK    (__SI_FAULT|8)    /* internal stack error */
  155. #define NSIGILL        8
  156.  
  157. /*
  158.  * SIGFPE si_codes
  159.  */
  160. #define FPE_INTDIV    (__SI_FAULT|1)    /* integer divide by zero */
  161. #define FPE_INTOVF    (__SI_FAULT|2)    /* integer overflow */
  162. #define FPE_FLTDIV    (__SI_FAULT|3)    /* floating point divide by zero */
  163. #define FPE_FLTOVF    (__SI_FAULT|4)    /* floating point overflow */
  164. #define FPE_FLTUND    (__SI_FAULT|5)    /* floating point underflow */
  165. #define FPE_FLTRES    (__SI_FAULT|6)    /* floating point inexact result */
  166. #define FPE_FLTINV    (__SI_FAULT|7)    /* floating point invalid operation */
  167. #define FPE_FLTSUB    (__SI_FAULT|8)    /* subscript out of range */
  168. #define NSIGFPE        8
  169.  
  170. /*
  171.  * SIGSEGV si_codes
  172.  */
  173. #define SEGV_MAPERR    (__SI_FAULT|1)    /* address not mapped to object */
  174. #define SEGV_ACCERR    (__SI_FAULT|2)    /* invalid permissions for mapped object */
  175. #define NSIGSEGV    2
  176.  
  177. /*
  178.  * SIGBUS si_codes
  179.  */
  180. #define BUS_ADRALN    (__SI_FAULT|1)    /* invalid address alignment */
  181. #define BUS_ADRERR    (__SI_FAULT|2)    /* non-existant physical address */
  182. #define BUS_OBJERR    (__SI_FAULT|3)    /* object specific hardware error */
  183. #define NSIGBUS        3
  184.  
  185. /*
  186.  * SIGTRAP si_codes
  187.  */
  188. #define TRAP_BRKPT    (__SI_FAULT|1)    /* process breakpoint */
  189. #define TRAP_TRACE    (__SI_FAULT|2)    /* process trace trap */
  190. #define NSIGTRAP    2
  191.  
  192. /*
  193.  * SIGCHLD si_codes
  194.  */
  195. #define CLD_EXITED    (__SI_CHLD|1)    /* child has exited */
  196. #define CLD_KILLED    (__SI_CHLD|2)    /* child was killed */
  197. #define CLD_DUMPED    (__SI_CHLD|3)    /* child terminated abnormally */
  198. #define CLD_TRAPPED    (__SI_CHLD|4)    /* traced child has trapped */
  199. #define CLD_STOPPED    (__SI_CHLD|5)    /* child has stopped */
  200. #define CLD_CONTINUED    (__SI_CHLD|6)    /* stopped child has continued */
  201. #define NSIGCHLD    6
  202.  
  203. /*
  204.  * SIGPOLL si_codes
  205.  */
  206. #define POLL_IN        (__SI_POLL|1)    /* data input available */
  207. #define POLL_OUT    (__SI_POLL|2)    /* output buffers available */
  208. #define POLL_MSG    (__SI_POLL|3)    /* input message available */
  209. #define POLL_ERR    (__SI_POLL|4)    /* i/o error */
  210. #define POLL_PRI    (__SI_POLL|5)    /* high priority input available */
  211. #define POLL_HUP    (__SI_POLL|6)    /* device disconnected */
  212. #define NSIGPOLL    6
  213.  
  214. /*
  215.  * sigevent definitions
  216.  * 
  217.  * It seems likely that SIGEV_THREAD will have to be handled from 
  218.  * userspace, libpthread transmuting it to SIGEV_SIGNAL, which the
  219.  * thread manager then catches and does the appropriate nonsense.
  220.  * However, everything is written out here so as to not get lost.
  221.  */
  222. #define SIGEV_SIGNAL    0    /* notify via signal */
  223. #define SIGEV_NONE    1    /* other notification: meaningless */
  224. #define SIGEV_THREAD    2    /* deliver via thread creation */
  225. #define SIGEV_THREAD_ID 4    /* deliver to thread */
  226.  
  227. /*
  228.  * This works because the alignment is ok on all current architectures
  229.  * but we leave open this being overridden in the future
  230.  */
  231. #ifndef __ARCH_SIGEV_PREAMBLE_SIZE
  232. #define __ARCH_SIGEV_PREAMBLE_SIZE    (sizeof(int) * 2 + sizeof(sigval_t))
  233. #endif
  234.  
  235. #define SIGEV_MAX_SIZE    64
  236. #define SIGEV_PAD_SIZE    ((SIGEV_MAX_SIZE - __ARCH_SIGEV_PREAMBLE_SIZE) \
  237.         / sizeof(int))
  238.  
  239. typedef struct sigevent {
  240.     sigval_t sigev_value;
  241.     int sigev_signo;
  242.     int sigev_notify;
  243.     union {
  244.         int _pad[SIGEV_PAD_SIZE];
  245.          int _tid;
  246.  
  247.         struct {
  248.             void (*_function)(sigval_t);
  249.             void *_attribute;    /* really pthread_attr_t */
  250.         } _sigev_thread;
  251.     } _sigev_un;
  252. } sigevent_t;
  253.  
  254. #define sigev_notify_function    _sigev_un._sigev_thread._function
  255. #define sigev_notify_attributes    _sigev_un._sigev_thread._attribute
  256. #define sigev_notify_thread_id     _sigev_un._tid
  257.  
  258.  
  259. #endif
  260.